#include <iostream>
#include <memory>

class Node
{
public:
    std::shared_ptr<Node> next;
    std::weak_ptr<Node> prev;
    Node() : next(nullptr), prev() {}
};

int main()
{
    // std::weak_ptr：弱引用智能指针，用于与 shared_ptr 配合使用，避免循环引用导致的内存泄漏。
    // std::weak_ptr 既不增加引用计数，也不阻止 shared_ptr 把资源回收
    std::shared_ptr<Node> node1 = std::make_shared<Node>();
    std::shared_ptr<Node> node2 = std::make_shared<Node>();

    node1->next = node2;
    node2->prev = node1;
    // 循环引用，但使用 weak_ptr 避免了内存泄漏

    std::cout << "-------------------\n";
    struct Foo
    {
        ~Foo() { std::cout << "Foo 销毁\n"; }
    };
    std::weak_ptr<Foo> w;
    {
        auto s = std::make_shared<Foo>(); // 强引用 =1，弱引用 =0
        w = s;                            // 强引用仍 =1，弱引用 =1
        std::cout << "离开内部作用域前\n";
    } // 强引用 =0 → Foo 被销毁
    std::cout << "离开内部作用域后\n";
    if (auto s2 = w.lock())
    { // 试图升级
        std::cout << "升级成功，不会执行到这\n";
    }
    else
    {
        std::cout << "资源已消失，升级失败\n";
    }
    return 0;
}